//
// 回调函数
//
#include "stdlib.h"
#include "stdio.h"

//函数指针
/**
 * 函数指针是指向函数的指针变量。

通常我们说的指针变量是指向一个整型、字符型或数组等变量，而函数指针是指向函数。

函数指针可以像一般函数一样，用于调用函数、传递参数。
 typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
 */
int max(int x,int y){
    return x>y?x:y;
}
//不能重载
//float max(float x,float y){
//    return x>y>x:y;
//}

int max_max(int x,int y,int z){
    return max(max(x,y),z);
}

char max_char(char a,char b){
    return a>b?a:b;
}

float max_float(float a,float b){
    return a>b?a:b;
}

//回调函数 实例中 populate_array() 函数定义了三个参数，其中第三个参数是函数的指针，通过该函数来设置数组的值。
//
//实例中我们定义了回调函数 getNextRandomValue()，它返回一个随机值，它作为一个函数指针传递给 populate_array() 函数。
//
//populate_array() 将调用 10 次回调函数，并将回调函数的返回值赋值给数组。

int array(int *array,size_t arraySize,int (*getNextValue)(void)){
    for(size_t i=0;i<arraySize;i++){
        array[i]=getNextValue();
    }
}

int getNextValue(){
    return rand();
}

/**
 *
 * @return
 */
int main100(){
    /*p 指向函数的指针*/
    int (*p)(int,int)=&max;
    int (*p1)(int,int,int)=&max_max;
    char(*p2)(char,char)=&max_char;
    float (*p3)(float,float)=&max_float;
    int a=1,b=3,c=4;

    printf("max is %d \n",p(a,b));
    printf("max is %d \n",p1(a,b,c));
    printf("max is %c \n",p2('a','c'));
    printf("max is %g \n",p3(11.1,23.3));


    int myarray[10];
    array(myarray,10,getNextValue);

    for(int i=0;i<10;i++){
        printf("%d ",myarray[i]);
    }
    printf("\n");

    return 0;
}

